/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import Entidades.Estudiante;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author GUILLERMO
 */
public class ControladorDatos extends HttpServlet {

    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        //El parametro acción determina que se debe hacer, debe ser enviado desde el JSP
        String accion = request.getParameter("accion");
        if (accion.equals("insertar")) {
            insertar(request, response);
        } else if (accion.equals("todos")) {
            todos(request, response);
        } else if (accion.equals("eliminar")) {
            eliminar(request, response);
        } else if (accion.equals("editar")) {
            editar(request, response);//Solicita pagina para editar
        } else if (accion.equals("modificar")) {
            modificar(request, response);//modificar los datos de un estudiante
        } else {
            request.getRequestDispatcher("/Error.jsp").include(request, response);
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    /*
    Insertar un nuevo estudiante
     */
    private void insertar(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //Obtener los datos a guardar.
        String nombre = request.getParameter("txtnombreCompleto");
        String genero = request.getParameter("Genero");
        String pais = request.getParameter("listaPais");

        //Datos de la conexion
        String driver = "oracle.jdbc.driver.OracleDriver";
        String urlDB = "jdbc:oracle:thin:@localhost:1521:XE";
        String user = "estudiante";
        String pass = "root";

        //Objetos para manipular la conexion y los datos
        Connection con = null;//Objeto para la conexion
        Statement sentencia = null;//Objeto para definir y ejecutar las consultas sql
        String sql = "";

        try {
            //CARGAR DRIVER
            Class.forName(driver);
        } catch (Exception e) {
            System.out.println("No se ha podido cargar el Driver de ORACLE");
            request.getRequestDispatcher("/Error.jsp").include(request, response);
        }
        try {
            //ESTABLECER CONEXION
            con = DriverManager.getConnection(urlDB, user, pass);
            System.out.println("Conectado ...");

            //Definición de Sentencia SQL
            sql = "INSERT INTO ESTUDIANTES (ID,Nombre,Genero,PAIS_NAC) values "
                    + "(ESTUDIANTES_SEQ.NextVal,'" + nombre + "','" + genero + "','" + pais + "')";

            //Ejecutar sentencia
            sentencia = con.createStatement();
            sentencia.executeUpdate(sql);
            System.out.println("Inserción exitosa ! ...");
            request.getRequestDispatcher("/DatosIngresados.jsp").include(request, response);

        } catch (SQLException ex) {
            request.getRequestDispatcher("/Error.jsp").include(request, response);
            System.out.println("No se ha podido Insertar, o el SQL esta mal formado " + sql);
        } finally {
            try {
                //Liberar recursos
                sentencia.close();
                //cerrar conexion
                con.close();
            } catch (SQLException ex) {
                Logger.getLogger(ValidarUsuario.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    /*
    Obtener los estudiantes de la BD
     */
    private void todos(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //Datos de la conexion
        String driver = "oracle.jdbc.driver.OracleDriver";
        String urlDB = "jdbc:oracle:thin:@localhost:1521:XE";
        String user = "estudiante";
        String pass = "root";

        //Objetos para manipular la conexion y los datos
        Connection con = null;//Objeto para la conexion
        Statement sentencia = null;//Objeto para definir y ejecutar las consultas sql
        ResultSet resultado = null;//Objeto para obtener los resultados de las consultas sql
        String sql = "";
        try {
            //CARGAR DRIVER
            Class.forName(driver);

            //ESTABLECER CONEXION
            con = DriverManager.getConnection(urlDB, user, pass);
            System.out.println("Conectado ...");

            //Definición de Sentencia SQL
            sql = "SELECT ID,NOMBRE,GENERO,PAIS_NAC FROM ESTUDIANTES ORDER BY ID";

            //Ejecutar sentencia
            sentencia = con.createStatement();
            resultado = sentencia.executeQuery(sql);

            //arreglo donde se gurdaran los estudiantes encontrados en la BD
            ArrayList Estudiantes = new ArrayList();
            while (resultado.next()) //si el resultado tiene datos empezar a guardarlos.
            {
                Estudiante e = new Estudiante(resultado.getInt(1), resultado.getString(2), resultado.getString(3),
                        resultado.getString(4));
                //Agregamos el estudiante al arrelo
                Estudiantes.add(e);
            }
            // Agregar el arreglo de estudiantes a la solicitud
            request.setAttribute("estudiantes", Estudiantes);
            //redirigir la solicitu a la página JSP
            request.getRequestDispatcher("/ListaEstudiantes.jsp").include(request, response);
            //cerrar la conexion
            con.close();
        } catch (ClassNotFoundException ex) {
            System.out.println("No se ha podido cargar el Driver de ORACLE");
            //request.getRequestDispatcher("/Error.jsp").include(request, response);
            //request.getRequestDispatcher("/Error.jsp").forward(request, response);
            response.sendRedirect("Error.jsp");
        } catch (SQLException ex) {
            System.out.println("No se ha podido establecer la conexión, o el SQL esta mal formado " + sql);
            request.getRequestDispatcher("/Error.jsp").forward(request, response);
        }
    }

    /*Eliminar un Estudiante*/
    private void eliminar(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //Datos de la conexion
        String driver = "oracle.jdbc.driver.OracleDriver";
        String urlDB = "jdbc:oracle:thin:@localhost:1521:XE";
        String user = "estudiante";
        String pass = "root";

        //Objetos para manipular la conexion y los datos
        Connection con = null;//Objeto para la conexion
        Statement sentencia = null;//Objeto para definir y ejecutar las consultas sql
        ResultSet resultado = null;//Objeto para obtener los resultados de las consultas sql
        String sql = "";
        try {
            //CARGAR DRIVER
            Class.forName(driver);

            //ESTABLECER CONEXION
            con = DriverManager.getConnection(urlDB, user, pass);
            System.out.println("Conectado ...");

            //OBTENER EL DATO A ELIMINAR
            String idEstudiante = request.getParameter("ID");

            //Definición de Sentencia SQL
            sql = "DELETE FROM ESTUDIANTES WHERE ID='" + idEstudiante + "'";

            //Ejecutar sentencia
            sentencia = con.createStatement();
            resultado = sentencia.executeQuery(sql);
            System.out.println("Borrado exitoso !");
            //cerrar la conexion
            con.close();

            //listar de nuevo los datos
            todos(request, response);

        } catch (ClassNotFoundException ex) {
            System.out.println("No se ha podido cargar el Driver de ORACLE");
            //request.getRequestDispatcher("/Error.jsp").include(request, response);
            //request.getRequestDispatcher("/Error.jsp").forward(request, response);
            response.sendRedirect("Error.jsp");
        } catch (SQLException ex) {
            System.out.println("No se ha podido establecer la conexión, o el SQL esta mal formado " + sql);
            request.getRequestDispatcher("/Error.jsp").forward(request, response);
        }

    }

    private void editar(HttpServletRequest request, HttpServletResponse response) {
        // buscar los datos del registro.

        //Datos de la conexion
        String driver = "oracle.jdbc.driver.OracleDriver";
        String urlDB = "jdbc:oracle:thin:@localhost:1521:XE";
        String user = "estudiante";
        String pass = "root";

        //Objetos para manipular la conexion y los datos
        Connection con = null;//Objeto para la conexion
        Statement sentencia = null;//Objeto para definir y ejecutar las consultas sql
        ResultSet resultado = null;//Objeto para obtener los resultados de las consultas sql
        String sql = "";

        //Objeto Estudiante
        Estudiante e = null;
        try {
            //CARGAR DRIVER
            Class.forName(driver);

            //ESTABLECER CONEXION
            con = DriverManager.getConnection(urlDB, user, pass);
            System.out.println("Conectado ...");

            //OBTENER EL DATO A CONSULTAR
            String idEstudiante = request.getParameter("ID");

            //Definición de Sentencia SQL
            sql = "SELECT ID,NOMBRE,GENERO,PAIS_NAC FROM ESTUDIANTES WHERE ID='" + idEstudiante + "'";

            //Ejecutar sentencia
            sentencia = con.createStatement();
            resultado = sentencia.executeQuery(sql);

            // VER SI HAY RESULTADODOS
            while (resultado.next()) {
                e = new Estudiante(resultado.getInt(1), resultado.getString(2), resultado.getString(3),
                        resultado.getString(4));
                break; //se supone que debe haber un solo registro.
            }

            // Agregar el estudiantes a la solicitud
            request.setAttribute("estudiante", e);

            //redirigir la solicitud a la página JSP
            request.getRequestDispatcher("/NuevoEstudiante.jsp").include(request, response);
            //cerrar la conexion
            con.close();


        } catch (ServletException ex) {
            Logger.getLogger(ControladorDatos.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(ControladorDatos.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            try {
                System.out.println("No se ha podido cargar el Driver de ORACLE");
                //request.getRequestDispatcher("/Error.jsp").include(request, response);
                //request.getRequestDispatcher("/Error.jsp").forward(request, response);
                response.sendRedirect("Error.jsp");
            } catch (IOException ex1) {
                Logger.getLogger(ControladorDatos.class.getName()).log(Level.SEVERE, null, ex1);
            }
        } catch (SQLException ex) {
            try {
                System.out.println("No se ha podido establecer la conexión, o el SQL esta mal formado " + sql);
                request.getRequestDispatcher("/Error.jsp").forward(request, response);
            } catch (ServletException ex1) {
                Logger.getLogger(ControladorDatos.class.getName()).log(Level.SEVERE, null, ex1);
            } catch (IOException ex1) {
                Logger.getLogger(ControladorDatos.class.getName()).log(Level.SEVERE, null, ex1);
            }
        }

    }

    private void modificar(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //Obtener los datos a modificar.
        String nombre = request.getParameter("txtnombreCompleto");
        String genero = request.getParameter("Genero");
        String pais = request.getParameter("listaPais");

        String IDEstudiante=request.getParameter("IdEstudiante"); //id del estudiante a modificar

        //Datos de la conexion
        String driver = "oracle.jdbc.driver.OracleDriver";
        String urlDB = "jdbc:oracle:thin:@localhost:1521:XE";
        String user = "estudiante";
        String pass = "root";

        //Objetos para manipular la conexion y los datos
        Connection con = null;//Objeto para la conexion
        Statement sentencia = null;//Objeto para definir y ejecutar las consultas sql
        String sql = "";

        try {
            //CARGAR DRIVER
            Class.forName(driver);
        } catch (Exception e) {
            System.out.println("No se ha podido cargar el Driver de ORACLE");
            request.getRequestDispatcher("/Error.jsp").include(request, response);
        }
        try {
            //ESTABLECER CONEXION
            con = DriverManager.getConnection(urlDB, user, pass);
            System.out.println("Conectado ...");

            //Definición de Sentencia SQL
            sql = "UPDATE ESTUDIANTES SET Nombre='" + nombre + "', "
                    + "Genero='" + genero + "', "
                    + "PAIS_NAC='" + pais + "' "
                    + "WHERE ID ='"+IDEstudiante+"'";

            //Ejecutar sentencia
            sentencia = con.createStatement();
            sentencia.executeUpdate(sql);
            System.out.println("Actualizacion exitosa ! ...");
            request.getRequestDispatcher("/DatosIngresados.jsp").include(request, response);

        } catch (SQLException ex) {
            request.getRequestDispatcher("/Error.jsp").include(request, response);
            System.out.println("No se ha podido Insertar, o el SQL esta mal formado " + sql);
        } finally {
            try {
                //Liberar recursos
                sentencia.close();
                //cerrar conexion
                con.close();
            } catch (SQLException ex) {
                Logger.getLogger(ValidarUsuario.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

    }
}
